首先來聽首歌吧
這是一個主要都用木吉他伴奏的外國素人歌手,在這裡也推薦大家聽聽看囉!
今天的文章從這裡的 3.4.4 段落開始
假設 _qoo.html.erb 裡面有使用 qoo1 這個變數,我們要怎麼傳給他呢?
Rails Guide 中提到了滿多方法,這邊一一來說明:
<%= render partial: "form" , locals: {qoo1: @qoo1} %>
但文章中沒提到的是,如果你今天把前面的 partial 給省略掉,後面使用 locals 是會發生錯誤的,這時候需要把 locals 也省略掉變成下面這樣
<%= render "form" , qoo1: @qoo1 %>
當我們使用一個 partial 的時候,他其實會內建一個跟這個 partial 名字相同的區域變數,我們可以使用 object
這個屬性,把值傳給他
<!-- index.html.erb -->
<%= render partial: "form" , object: @qoo1 %>
_form.html.erb 裡面只要用 form 這個變數就可以拿到了!
<h1>這是 form 的畫面喔!</h1>
<%= form %>
除此之外,還可以傳一整組的變數進去
一般來說,我們如果要在首頁印出一大堆資料庫裡面的資料,會使用 each 來印,但 collection 這個屬性,讓我們可以讓程式碼更簡潔
<!-- index.html.erb -->
<%= render partial: "form", collection: @forms %>
<!-- _form.html.erb -->
<p>form 名字 <%= form.name %></p>
如此一來,看你的資料有幾組,就會幫你印幾組的資料,這時候你的頁面應該長得像下面這樣
甚至你可以再更進一步簡化變成下面這樣
<%= render @customers %>
不過必須提醒一下,像這種魔術的用法, partial 的檔案必須放在對的資料夾中才會起作用,在這個例子中是放在 views/forms 這個資料夾,除此之外還需要有 Form 這個 model,還有什麼時候用複數什麼時候用單數也都完全不能錯,眾多條件缺一不可,因此也不是很實用的一個技能 XD
當你在使用 collection 傳變數時,如果 partial 裡面的區域變數名字不同的話你可以使用 as 這個屬性修改
<!-- index.html.erb -->
<%= render partial: "form", collection: @forms, as: :qoo%>
在上面這個例子中,就可以使用從 controller 那邊接收到的 @forms 這個實體變數,傳到 partial 中的 qoo 區域變數使用
除此之外,文章中還提到 local_assigns
這個方法,它可以用來判斷是否這個 partial 頁面有被給予變數,不過我覺得 Rails Guide 裡面提到的範例實在讓人太難懂,所以只好自己做個簡單的範例:
下面是 partial 的檔案,我們直接把條件判斷利用 local_assigns 寫在裡面,如果有給 qoo1 的話會看到一種畫面,如果沒給則會看到另一種
<!-- _form.html.erb -->
<h1>這是 form 的畫面喔!</h1>
<% if local_assigns[:qoo1] %>
有給 qoo1 的才看得到這句
<%= qoo1 %>
<% else %>
沒給 qoo1 的才看得到這句
<% end %>
今天我的 index 頁面如果有給 qoo1 這個變數的話
<!-- index.html.erb -->
<%= render "form" , qoo1: @qoo1 %>
看到的畫面如下
反之,如果沒有給 qoo1 的話
<!-- index.html.erb -->
<%= render "form" %>
看到的畫面如下
剩下 Rails Guide 還有介紹一些上面這些方法的組合技,再麻煩大家自己看一下了~
希望這次介紹傳變數給 partial 的方法有幫助到大家,畢竟測試哪些方法需要符合哪些慣例也是花了我不少時間,希望這時間花得很值得!
參考資料
Rails Guide
Extending Rails partials using local_assigns
本文章同步分享於 http://anthonychao.site/
此處能否理解為,「反向」從網頁傳變數給layout(模板)?為什麼不直接在模板把東西寫好就好?
在使用object與collection的例子中,那兩個變數(object: @qoo1 與collection: @forms)內容差別是什麼?為什麼後者是一組變數?